// import com.alibaba.druid.FastsqlException;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
// import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
// import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl;
// import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
// import com.alibaba.druid.util.FnvHash;

// import java.io.IOException;
// import java.util.Collections;
// import java.util.List;
#pragma once
#include <sstream>
#include "../SQLServerObjectImpl.h"
#include "SQLServerExpr.h"
#include "../../../../ast/SQLName.h"

class SQLServerObjectReferenceExpr : virtual public SQLServerObjectImpl, virtual public SQLServerExpr, virtual public SQLName
{
public:
  string_ptr server;
  string_ptr database;
  string_ptr schema;

  long schemaHashCode64;
  long hashCode64_;

  SQLServerObjectReferenceExpr();

  SQLServerObjectReferenceExpr(SQLExpr_ptr owner);
  SHAREDOBJECT(SQLServerObjectReferenceExpr);

  string_ptr getSimpleName();

  // @Override
  void accept0(SQLServerASTVisitor_ptr visitor);

  void output(std::stringstream *  buf);

  string_ptr getServer();

  void setServer(string_ptr server);

  string_ptr getDatabase();

  void setDatabase(string_ptr database);

  string_ptr getSchema();

  void setSchema(string_ptr schema);

  SQLObject_ptr clone();

  long nameHashCode64();

  // @Override
  long hashCode64();

  // @Override
  SQLObject_ptr getResolvedColumn();

  SQLObject_list_ptr getChildren();
};
